package org.coopac.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.RequestScoped;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;

import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

import org.coopac.model.CoopacDireccionPersona;
import org.coopac.model.CoopacDocumentoPersona;
import org.coopac.model.CoopacPersona;
import org.coopac.model.CoopacTelefonoPersona;
import org.coopac.model.CoopacTipoMaestro;
import org.coopac.model.CoopacUbigeo;
import org.coopac.service.IDireccionPersonaService;
import org.coopac.service.IDocumentoPersonaService;
import org.coopac.service.IPersonaService;
import org.coopac.service.ITelefonoPersonaService;
import org.coopac.service.ITipoMaestroService;
import org.coopac.service.IUbigeoService;
import org.coopac.model.CoopacConsultaSocioPotencial;
import org.coopac.model.CoopacDetalleConsultaSocioPotencial;
import org.coopac.service.IConsultaSocioPotencialService;
import org.coopac.service.IDetalleConsultaSocioPotencialService;
import org.coopac.service.ITipoCreditoService;
import org.coopac.service.ITipoCuentaService;
import org.coopac.model.CoopacTipoCredito;
import org.coopac.model.CoopacTipoCuenta;
import org.coopac.controller.util.CreditoDataModel;
import org.coopac.controller.util.CuentaDataModel;
import org.coopac.controller.util.UbigeoController;

@ManagedBean(name = "persona")
//RequestScoped
//SessionScoped
@ViewScoped
public class PersonaController implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	@ManagedProperty(value = "#{personaService}")
	IPersonaService personaServicio;
	CoopacPersona personaN;

	@ManagedProperty(value = "#{documentoPersonaService}")
	IDocumentoPersonaService documentoService;
	CoopacDocumentoPersona documentoPersonaN;

	@ManagedProperty(value = "#{telefonoPersonaService}")
	ITelefonoPersonaService telefonoService;
	CoopacTelefonoPersona telefonoPersonaN;

	@ManagedProperty(value = "#{direccionPersonaService}")
	IDireccionPersonaService direccionService;
	CoopacDireccionPersona direccionPersonaN;

	@ManagedProperty(value = "#{ubigeoService}")
	IUbigeoService ubigeoService;
	CoopacUbigeo ubigego;
	
	UbigeoController ubigeoController;
	
	@ManagedProperty(value = "#{tipoMaestroService}")
	ITipoMaestroService tipoMaestroService;
	CoopacTipoMaestro tipoMaestro;

	@ManagedProperty(value = "#{tipoCuentaService}")
	ITipoCuentaService tipoCuentaService;

	@ManagedProperty(value = "#{tipoCreditoService}")
	ITipoCreditoService tipoCreditoService;

	@ManagedProperty(value = "#{consultaSocioPotencialService}")
	IConsultaSocioPotencialService consultaSocioPotencialService;
	CoopacConsultaSocioPotencial coopacConsultaSocioPotencial;

	@ManagedProperty(value = "#{detalleConsultaSocioPotencialService}")
	IDetalleConsultaSocioPotencialService detalleConsultaSocioPotencialService;
	CoopacDetalleConsultaSocioPotencial coopacDetalleConsultaSocioPotencial;

	CoopacTipoMaestro tipoMaestroPersona, tipoMaestroZona, tipoMaestroVia,
			tipoMaestroTipoVivienda, tipoMaestroDni, tipoMaestroTipoTelefono;

	private Integer idDistrito;
	private Integer idCTMNatural;
	private Integer idCTMZona;
	private Integer idCTMVia;
	private Integer idCTMVivienda;
	private Integer idCTMTelf;
	private String numero;
	
	List<SelectItem> listaPersonaByApellidos;

	public PersonaController() {
		ubigego = new CoopacUbigeo();
		personaN = new CoopacPersona();
		documentoPersonaN = new CoopacDocumentoPersona();
		direccionPersonaN = new CoopacDireccionPersona();
		telefonoPersonaN = new CoopacTelefonoPersona();
		tipoMaestroPersona = new CoopacTipoMaestro();
		tipoMaestroZona = new CoopacTipoMaestro();
		tipoMaestroVia = new CoopacTipoMaestro();
		tipoMaestroTipoVivienda = new CoopacTipoMaestro();
		tipoMaestroDni = new CoopacTipoMaestro();
		tipoMaestroTipoTelefono = new CoopacTipoMaestro();
		coopacConsultaSocioPotencial = new CoopacConsultaSocioPotencial();
		coopacDetalleConsultaSocioPotencial = new CoopacDetalleConsultaSocioPotencial();
		ubigeoController = new UbigeoController();
		listaPersonaByApellidos = new ArrayList<SelectItem>();

	}

	
	
	public UbigeoController getUbigeoController() {
		return ubigeoController;
	}



	public void setUbigeoController(UbigeoController ubigeoController) {
		this.ubigeoController = ubigeoController;
	}



	public IUbigeoService getUbigeoService() {
		return ubigeoService;
	}

	public void setUbigeoService(IUbigeoService ubigeoService) {
		this.ubigeoService = ubigeoService;
	}

	public ITipoMaestroService getTipoMaestroService() {
		return tipoMaestroService;
	}

	public void setTipoMaestroService(ITipoMaestroService tipoMaestroService) {
		this.tipoMaestroService = tipoMaestroService;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public CoopacUbigeo getUbigego() {
		return ubigego;
	}

	public void setUbigego(CoopacUbigeo ubigego) {
		this.ubigego = ubigego;
	}

	public IPersonaService getPersonaServicio() {
		return personaServicio;
	}

	public void setPersonaServicio(IPersonaService personaServicio) {
		this.personaServicio = personaServicio;
	}

	public CoopacPersona getPersonaN() {
		return personaN;
	}

	public void setPersonaN(CoopacPersona personaN) {
		this.personaN = personaN;
	}

	public IDocumentoPersonaService getDocumentoService() {
		return documentoService;
	}

	public void setDocumentoService(IDocumentoPersonaService documentoService) {
		this.documentoService = documentoService;
	}

	public CoopacDocumentoPersona getDocumentoPersonaN() {
		return documentoPersonaN;
	}

	public void setDocumentoPersonaN(CoopacDocumentoPersona documentoPersonaN) {
		this.documentoPersonaN = documentoPersonaN;
	}

	public ITelefonoPersonaService getTelefonoService() {
		return telefonoService;
	}

	public void setTelefonoService(ITelefonoPersonaService telefonoService) {
		this.telefonoService = telefonoService;
	}

	public IDireccionPersonaService getDireccionService() {
		return direccionService;
	}

	public void setDireccionService(IDireccionPersonaService direccionService) {
		this.direccionService = direccionService;
	}

	public CoopacTipoMaestro getTipoMaestroZona() {
		return tipoMaestroZona;
	}

	public void setTipoMaestroZona(CoopacTipoMaestro tipoMaestroZona) {
		this.tipoMaestroZona = tipoMaestroZona;
	}

	public CoopacTipoMaestro getTipoMaestroVia() {
		return tipoMaestroVia;
	}

	public void setTipoMaestroVia(CoopacTipoMaestro tipoMaestroVia) {
		this.tipoMaestroVia = tipoMaestroVia;
	}

	public CoopacTipoMaestro getTipoMaestroTipoVivienda() {
		return tipoMaestroTipoVivienda;
	}

	public void setTipoMaestroTipoVivienda(
			CoopacTipoMaestro tipoMaestroTipoVivienda) {
		this.tipoMaestroTipoVivienda = tipoMaestroTipoVivienda;
	}

	public CoopacTipoMaestro getTipoMaestroDni() {
		return tipoMaestroDni;
	}

	public void setTipoMaestroDni(CoopacTipoMaestro tipoMaestroDni) {
		this.tipoMaestroDni = tipoMaestroDni;
	}

	public CoopacTipoMaestro getTipoMaestroPersona() {
		return tipoMaestroPersona;
	}

	public void setTipoMaestroPersona(CoopacTipoMaestro tipoMaestroPersona) {
		this.tipoMaestroPersona = tipoMaestroPersona;
	}

	public CoopacTipoMaestro getTipoMaestroTipoTelefono() {
		return tipoMaestroTipoTelefono;
	}

	public void setTipoMaestroTipoTelefono(
			CoopacTipoMaestro tipoMaestroTipoTelefono) {
		this.tipoMaestroTipoTelefono = tipoMaestroTipoTelefono;
	}

	public Integer getIdDistrito() {
		return idDistrito;
	}

	public void setIdDistrito(Integer idDistrito) {
		this.idDistrito = idDistrito;
	}

	public Integer getIdCTMZona() {
		return idCTMZona;
	}

	public void setIdCTMZona(Integer idCTMZona) {
		this.idCTMZona = idCTMZona;
	}

	public Integer getIdCTMVia() {
		return idCTMVia;
	}

	public void setIdCTMVia(Integer idCTMVia) {
		this.idCTMVia = idCTMVia;
	}

	public Integer getIdCTMVivienda() {
		return idCTMVivienda;
	}

	public void setIdCTMVivienda(Integer idCTMVivienda) {
		this.idCTMVivienda = idCTMVivienda;
	}

	public Integer getIdCTMNatural() {
		return idCTMNatural;
	}

	public void setIdCTMNatural(Integer idCTMNatural) {
		this.idCTMNatural = idCTMNatural;
	}

	public Integer getIdCTMTelf() {
		return idCTMTelf;
	}

	public void setIdCTMTelf(Integer idCTMTelf) {
		this.idCTMTelf = idCTMTelf;
	}

	public CoopacTelefonoPersona getTelefonoPersonaN() {
		return telefonoPersonaN;
	}

	public void setTelefonoPersonaN(CoopacTelefonoPersona telefonoPersonaN) {
		this.telefonoPersonaN = telefonoPersonaN;
	}

	public CoopacDireccionPersona getDireccionPersonaN() {
		return direccionPersonaN;
	}

	public void setDireccionPersonaN(CoopacDireccionPersona direccionPersonaN) {
		this.direccionPersonaN = direccionPersonaN;
	}

	public CoopacTipoMaestro getTipoMaestro() {
		return tipoMaestro;
	}

	public void setTipoMaestro(CoopacTipoMaestro tipoMaestro) {
		this.tipoMaestro = tipoMaestro;
	}

	public ITipoCuentaService getTipoCuentaService() {
		return tipoCuentaService;
	}

	public void setTipoCuentaService(ITipoCuentaService tipoCuentaService) {
		this.tipoCuentaService = tipoCuentaService;
	}

	public ITipoCreditoService getTipoCreditoService() {
		return tipoCreditoService;
	}

	public void setTipoCreditoService(ITipoCreditoService tipoCreditoService) {
		this.tipoCreditoService = tipoCreditoService;
	}

	public IConsultaSocioPotencialService getConsultaSocioPotencialService() {
		return consultaSocioPotencialService;
	}

	public void setConsultaSocioPotencialService(
			IConsultaSocioPotencialService consultaSocioPotencialService) {
		this.consultaSocioPotencialService = consultaSocioPotencialService;
	}

	public CoopacConsultaSocioPotencial getCoopacConsultaSocioPotencial() {
		return coopacConsultaSocioPotencial;
	}

	public void setCoopacConsultaSocioPotencial(
			CoopacConsultaSocioPotencial coopacConsultaSocioPotencial) {
		this.coopacConsultaSocioPotencial = coopacConsultaSocioPotencial;
	}

	public IDetalleConsultaSocioPotencialService getDetalleConsultaSocioPotencialService() {
		return detalleConsultaSocioPotencialService;
	}

	public void setDetalleConsultaSocioPotencialService(
			IDetalleConsultaSocioPotencialService detalleConsultaSocioPotencialService) {
		this.detalleConsultaSocioPotencialService = detalleConsultaSocioPotencialService;
	}

	public CoopacDetalleConsultaSocioPotencial getCoopacDetalleConsultaSocioPotencial() {
		return coopacDetalleConsultaSocioPotencial;
	}

	public void setCoopacDetalleConsultaSocioPotencial(
			CoopacDetalleConsultaSocioPotencial coopacDetalleConsultaSocioPotencial) {
		this.coopacDetalleConsultaSocioPotencial = coopacDetalleConsultaSocioPotencial;
	}

	public void addPersona(ActionEvent event) {

		tipoMaestroPersona.setIdTipoMaestro(51);
		personaN.setCoopacTipoMaestroByIdTipoMaestroPersona(tipoMaestroPersona);
		personaN.setFlag(true);
		personaServicio.save(personaN);

		documentoPersonaN.setCoopacPersona(personaN);
		tipoMaestroDni.setIdTipoMaestro(idCTMNatural);
		documentoPersonaN.setCoopacTipoMaestro(tipoMaestroDni);
		documentoPersonaN.setFlag(true);
		documentoService.save(documentoPersonaN);

		telefonoPersonaN.setCoopacPersona(personaN);
		tipoMaestroTipoTelefono.setIdTipoMaestro(idCTMTelf);
		telefonoPersonaN.setCoopacTipoMaestro(tipoMaestroTipoTelefono);
		telefonoPersonaN.setFlag(true);
		telefonoService.save(telefonoPersonaN);

		direccionPersonaN.setCoopacPersona(personaN);
		tipoMaestroZona.setIdTipoMaestro(idCTMZona);
		direccionPersonaN.setCoopacTipoMaestroByIdTipoMaestroZona(tipoMaestroZona);
		tipoMaestroVia.setIdTipoMaestro(idCTMVia);
		direccionPersonaN.setCoopacTipoMaestroByIdTipoMaestroVia(tipoMaestroVia);
		tipoMaestroTipoVivienda.setIdTipoMaestro(idCTMVivienda);
		direccionPersonaN.setCoopacTipoMaestroByIdTipoMaestroVivienda(tipoMaestroTipoVivienda);
		ubigego.setIdUbigeo(idDistrito);
		direccionPersonaN.setCoopacUbigeo(ubigego);
		direccionPersonaN.setFlag(true);
		direccionService.save(direccionPersonaN);

		guardarCuentasyCreditos();
	
		
		limpiarCampos(event);

	}
    
	public List<SelectItem> getListaPersonaByApellidos() {
		List<String> o = new ArrayList<String>();
		o.addAll(personaServicio.listarPersonaDocumento());
		listaPersonaByApellidos = new ArrayList<SelectItem>();
		for(String ob:o){
			listaPersonaByApellidos.add(new SelectItem(ob.substring(ob.lastIndexOf("-")+2, ob.length())));
			//listaPersonaByApellidos.add(new SelectItem(ob));
		}
		
		return listaPersonaByApellidos;
	}



	public void setListaPersonaByApellidos(List<SelectItem> listaPersonaByApellidos) {
		this.listaPersonaByApellidos = listaPersonaByApellidos;
	}



	public void buscarByNumDocumento(ActionEvent event){
		try{
			CoopacDocumentoPersona documento = documentoService.getPersonaByDocumento(numero);
			Integer id = documento.getIdDocumentoPersona();
			documentoPersonaN =  documentoService.getById(id);
			Integer id3 = documentoPersonaN.getCoopacPersona().getIdPersona();
			personaN = personaServicio.getById(id3);
			direccionPersonaN = direccionService.getDireccionByPersona(id3);
			telefonoPersonaN = telefonoService.getTelefonoByPersona(id3);
			Integer id4 = direccionPersonaN.getCoopacUbigeo().getIdUbigeo();
			ubigego = ubigeoService.getById(id4);
			Integer id5 = direccionPersonaN.getCoopacTipoMaestroByIdTipoMaestroVia().getIdTipoMaestro();
			tipoMaestro = tipoMaestroService.getById(id5);
		}catch (Exception e) {
			// TODO: handle exception
			System.out.println(e);
		}
	}

	private CuentaDataModel cuentas;

	public CuentaDataModel getCuentas() {
		List<CoopacTipoCuenta> lista1 = tipoCuentaService.listar();
		cuentas = new CuentaDataModel(lista1);
		return cuentas;
	}

	public void setCuentas(CuentaDataModel cuentas) {
		this.cuentas = cuentas;
	}

	private CreditoDataModel creditos;

	public CreditoDataModel getCreditos() {
		List<CoopacTipoCredito> lista2 = tipoCreditoService.listar();
		creditos = new CreditoDataModel(lista2);
		return creditos;
	}

	public void setCreditos(CreditoDataModel creditos) {
		this.creditos = creditos;
	}

	private CoopacTipoCuenta selectedCuenta;

	private CoopacTipoCuenta[] selectedCuentas;

	public CoopacTipoCuenta getSelectedCuenta() {
		return selectedCuenta;
	}

	public void setSelectedCuenta(CoopacTipoCuenta selectedCuenta) {
		this.selectedCuenta = selectedCuenta;
	}

	public CoopacTipoCuenta[] getSelectedCuentas() {
		return selectedCuentas;
	}

	public void setSelectedCuentas(CoopacTipoCuenta[] selectedCuentas) {
		this.selectedCuentas = selectedCuentas;
	}

	private CoopacTipoCredito selectedCredito;

	private CoopacTipoCredito[] selectedCreditos;

	public CoopacTipoCredito getSelectedCredito() {
		return selectedCredito;
	}

	public void setSelectedCredito(CoopacTipoCredito selectedCredito) {
		this.selectedCredito = selectedCredito;
	}

	public CoopacTipoCredito[] getSelectedCreditos() {
		return selectedCreditos;
	}

	public void setSelectedCreditos(CoopacTipoCredito[] selectedCreditos) {
		this.selectedCreditos = selectedCreditos;
	}

	public void limpiar(ActionEvent event) {
		selectedCuentas = null;
		selectedCreditos = null;
	}
	
	public void limpiarCampos(ActionEvent event) {
		
		//ubigeoController.limpiarCampos();
		limpiar(event);
		personaN.setApellidoPaternoRazonSocial("");
		personaN.setApellidoMaterno("");
		personaN.setNombrePersonaNombreComercial("");
		personaN.setEmail("");
		personaN.setPaginaWeb("");
		documentoPersonaN.setNumero("");
		telefonoPersonaN.setNumero("");
		telefonoPersonaN.setAnexo("");
		direccionPersonaN.setNombreZona("");
		direccionPersonaN.setNombreVia("");
		direccionPersonaN.setNumero("");
		direccionPersonaN.setDepartamento("");
		direccionPersonaN.setInterior("");
		direccionPersonaN.setManzana("");
		direccionPersonaN.setLote("");
		direccionPersonaN.setKilometro("");
		direccionPersonaN.setReferencia("");
		idDistrito = 120804;
		idCTMNatural = 32;
		idCTMTelf = 38;
		idCTMZona = 2;
		idCTMVia = 15;
		idCTMVivienda = 27;
		coopacConsultaSocioPotencial.setObservacion("");

	}

	public void guardarCuentasyCreditos() {

		coopacConsultaSocioPotencial.setCoopacPersona(personaN);
		coopacConsultaSocioPotencial.setFlag(true);
		java.util.Date utilDate = new java.util.Date();
		SimpleDateFormat formatoDeFecha = new SimpleDateFormat("dd/MM/yyyy");
		coopacConsultaSocioPotencial.setFechaConsulta(formatoDeFecha.format(utilDate));
		consultaSocioPotencialService.save(coopacConsultaSocioPotencial);

		List<CoopacTipoCredito> lista1 = new ArrayList<CoopacTipoCredito>();
		lista1 = Arrays.asList(getSelectedCreditos());
		List<CoopacTipoCuenta> lista2 = new ArrayList<CoopacTipoCuenta>();
		lista2 = Arrays.asList(getSelectedCuentas());

		for (int i = 0; i < lista1.size(); i++) {
			coopacDetalleConsultaSocioPotencial
					.setCoopacConsultaSocioPotencial(coopacConsultaSocioPotencial);
			coopacDetalleConsultaSocioPotencial.setFlag(true);
			coopacDetalleConsultaSocioPotencial.setCoopacTipoCredito(lista1
					.get(i));
			coopacDetalleConsultaSocioPotencial.setCoopacTipoCuenta(null);
			System.out.println(lista1.get(i).getNombre());
			detalleConsultaSocioPotencialService
					.save(coopacDetalleConsultaSocioPotencial);
		}

		for (int i = 0; i < lista2.size(); i++) {
			coopacDetalleConsultaSocioPotencial
					.setCoopacConsultaSocioPotencial(coopacConsultaSocioPotencial);
			coopacDetalleConsultaSocioPotencial.setFlag(true);
			coopacDetalleConsultaSocioPotencial.setCoopacTipoCuenta(lista2
					.get(i));
			coopacDetalleConsultaSocioPotencial.setCoopacTipoCredito(null);
			System.out.println(lista2.get(i).getNombre());
			detalleConsultaSocioPotencialService
					.save(coopacDetalleConsultaSocioPotencial);
		}

	}

	public void toPDF(ActionEvent event) throws JRException, IOException {

		// private Integer idTipoCuenta;
		// private String nombre;
		// private String interes;
		// private String requisitos;
		// private String beneficios;
		// private String descripcion;
		// private Boolean flag;
		// init();
		// HttpServletResponse httpServletResponse = (HttpServletResponse)
		// FacesContext.getCurrentInstance().getExternalContext().getResponse();
		//
		// ServletOutputStream servletOutputStream =
		// httpServletResponse.getOutputStream();
		// JasperExportManager.exportReportToPdfStream(jasperPrint,servletOutputStream);
		// FacesContext.getCurrentInstance().getResponseComplete();

		List<CoopacTipoCuenta> lista1 = tipoCuentaService.listar();
		JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(
				lista1);
		@SuppressWarnings({ "rawtypes", "unchecked" })
		JasperPrint jasperPrint2 = JasperFillManager.fillReport(
				"I:\\workpace2\\reporte_coopac.jasper", new HashMap(),
				beanCollectionDataSource);
		JasperExportManager.exportReportToPdfFile(jasperPrint2,
				"I:\\workpace2\\hola.pdf");

		File pdf = File.createTempFile("output.", ".pdf");
		JasperExportManager.exportReportToPdfStream(jasperPrint2,
				new FileOutputStream(pdf));

		// JRExporter exporter = null;
		// exporter = new JRPdfExporter();
		// exporter.setParameter(JRExporterParameter.JASPER_PRINT,
		// jasperPrint2);
		// exporter.exportReport();

	}

	JasperPrint jasperPrint;

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void init() throws JRException {
		List<CoopacTipoCuenta> lista1 = tipoCuentaService.listar();
		JRBeanCollectionDataSource beanCollectionDataSource = new JRBeanCollectionDataSource(
				lista1);
		jasperPrint = JasperFillManager.fillReport(
				"I:\\workpace2\\reporte_coopac.jasper", new HashMap(),
				beanCollectionDataSource);

	}
}
